package soporte.web;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import utn.frc.tsb.utils.ValerioFritelli.SimpleList.SimpleList;

/**
 * @project DLC Final / UTN FRC 2013
 * @date Febrero de 2013
 *
 * @author Gonzalo Arribere
 * @author Gustavo Morales
 * @author Pablo Moreno
 *
 * Esta clase tiene como objetivo resaltar en los resultados aquellas palabras
 * ingresadas por el usuario durante la busqueda.
 */
public class HighlighResultMatchs {

    private final String INI_REGEX = "(";
    private final String END_REGEX = ")";
    private final String MIDDLE_REGEX = ")|(";
    private final String INI_HIGHLIGH = "<strong>";
    private final String END_HIGHLIGH = "</strong>";
    private Pattern mPattern;

    /**
     * Constructor por parametros que inicializa los atributos de la clase.
     *
     * @param pWords
     */
    public HighlighResultMatchs(SimpleList pWords) {
        String[] origin = {"a", "e", "i", "o", "u"};

        String[] any = {"[aâãáàäÂÃÁÀÄ]+", "[eéèêëÉÈÊË]+", "[iíìîïÍÌÎÏ]+", "[oóòôõöÓÒÔÕÖ]+", "[uúùûüÚÙÛÜ]+"};

        int i;
        StringBuilder regex = new StringBuilder(INI_REGEX);
        String word;
        pWords.startIterator();

        while (pWords.hasNext()) {
            word = (String) pWords.next();
            for (i = 0; i < any.length; i++) {
                word = word.replace(origin[i], any[i]);
            }
            regex.append(word);
            regex.append(MIDDLE_REGEX);
        }
        regex.replace(regex.length() - MIDDLE_REGEX.length(), regex.length(), END_REGEX);
        mPattern = Pattern.compile(regex.toString(), Pattern.CASE_INSENSITIVE);
    }

    /**
     * Efectiviza el resaltado de un termino.
     *
     * @param pText termino a resaltar
     * @return termino resaltado.
     */
    public String doIt(String pText) {
        StringBuffer result = new StringBuffer();

        Matcher matcher = mPattern.matcher(pText);
        matcher = mPattern.matcher(pText);
        while (matcher.find()) {
            matcher.appendReplacement(result, INI_HIGHLIGH + matcher.group(0) + END_HIGHLIGH);
        }
        matcher.appendTail(result);

        return result.toString();
    }
}